package dto;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;

import entity.Hebergement;
import entity.Trajet;
import entity.Voyage;


public class VoyageVO implements ProduitVO , Serializable{
	
	private static final long serialVersionUID = 1L;
	static final int ALLER = 0; 
	static final int RETOUR = 1; 
	private long id;
	private LieuVO destination;
	List<TrajetVO> listeTrajet;
	List<HebergementVO> listeHebergement;
	//Set<PrestationAnnexeVO> listePrestAnnexe = new HashSet<PrestationAnnexe>();
	//Set<Thematique> listeThematique = new HashSet<Thematique>();


	public VoyageVO(Voyage v) {
		super();
		this.id = v.getId();
		this.destination=new LieuVO(v.getDestination());
		List<Trajet> listeT = v.getListeTrajet();
		if (null != listeT && listeT.size()>0) {
			this.listeTrajet=new ArrayList<TrajetVO>();
			for (Trajet t : listeT){
				this.listeTrajet.add(new TrajetVO (t));
			}
		}
		Set<Hebergement> listeH = v.getListeHebergement();
		if (null != listeH && listeH.size()>0) {
			this.listeHebergement=new ArrayList<HebergementVO>();
			for (Hebergement h : listeH){
				this.listeHebergement.add(new HebergementVO (h));
			}
		}
	}

	public String getDescription(){
		String result = "";
		TrajetVO aller = this.getAller();
		if (aller != null) {
			TrajetVO retour = this.getRetour();
			result = "ALLER";
			if (retour != null)
				result += "/RETOUR";
			result += " ";
			result += aller.getModeTransport().getLibelle();
			result += " ";
			result += aller.getLieuDepart();
			result += " ";
			result += aller.getLieuArrivee();
		}
		if (listeHebergement != null && listeHebergement.size() > 0) {
			if (! result.equals(""))
				result += " avec ";
			result += "Hébergement ";
			for (HebergementVO h : listeHebergement) {
				result += h.getDescription();
				if (aller == null) {
					result += " " + h.getAdresse().getLibelleCourt();
				}
				break;
			}
		}
		return result;
	}

	public double getPrix(){
		double result = 0;
		if (null != listeTrajet)
			for (TrajetVO t : listeTrajet){
				result += t.getTarif();
			}
		if (null != listeHebergement)
			for (HebergementVO h : listeHebergement){
				result += h.getTarif();
			}
		return result;
	}
	public Date getDateDebut(){
		//TODO
		return null;
	}

	@Override
	public String toString() {
		String laListeHebergement="";
		if (listeHebergement != null && listeHebergement.size() > 0) {
			laListeHebergement = ",  \n\tLa Liste : \n";
			for (HebergementVO h : listeHebergement) {
				laListeHebergement += "\t"+h.toString()+"\n";
			}
		}
		return "[" + destination + ", " + ( getAller()==null?"":(getRetour()==null?"ALLER":"ALLER-RETOUR") + ",  \n\t" 
		+ getAller() + (getRetour()==null?"":(", \n\t" + getRetour())) + ",  \n") + "\tListe Hébergement : "+
		(listeHebergement==null?"liste vide":listeHebergement.size()+" élément(s)") + laListeHebergement+"]";
	}
	public void setAller(TrajetVO trajet) {
		if (listeTrajet == null)
			listeTrajet = new ArrayList<TrajetVO>(2);
		listeTrajet.add(ALLER, trajet);
	}

	public TrajetVO getAller() {
		try {
			return listeTrajet.get(ALLER);
		} catch (Exception e) {
			return null;
		}
	}

	public void setRetour(TrajetVO trajet) {
		if (listeTrajet == null)
			listeTrajet = new ArrayList<TrajetVO>(2);
		listeTrajet.add(RETOUR, trajet);
	}

	public TrajetVO getRetour() {
		try {
			return listeTrajet.get(RETOUR);
		} catch (Exception e) {
			return null;
		}
	}

	public VoyageVO() {
		super();
	}

	public long getId() {
		return id;
	}
	public void setId(long id) {
		this.id = id;
	}

	public LieuVO getDestination() {
		return destination;
	}
	public void setDestination(LieuVO destination) {
		this.destination = destination;
	}

	public List<TrajetVO> getListeTrajet() {
		return listeTrajet;
	}
	public void setListeTrajet(List<TrajetVO> listeTrajet) {
		this.listeTrajet = listeTrajet;
	}

	public List<HebergementVO> getListeHebergement() {
		return listeHebergement;
	}
	public void setListeHebergement(List<HebergementVO> listeHebergement) {
		this.listeHebergement = listeHebergement;
	}

	/* public Set<PrestationAnnexeVO> getListePrestAnnexe() {
		return listePrestAnnexe;
	}
	public void setListePrestAnnexe(Set<PrestationAnnexeVO> listePrestAnnexe) {
		this.listePrestAnnexe = listePrestAnnexe;
	}

	public Set<ThematiqueVO> getListeThematique() {
		return listeThematique;
	}
	public void setListeThematique(Set<ThematiqueVO> listeThematique) {
		this.listeThematique = listeThematique;
	} **/
}
